package brinaryTree;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 113. 路径总和 II
 * <p>
 * 给你二叉树的根节点 root 和一个整数目标和 targetSum ，找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
 * <p>
 * 叶子节点 是指没有子节点的节点。
 */
public class N113_PathSumII {

    List<List<Integer>> result = new LinkedList<>();
    List<Integer> path = new LinkedList<>();

    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        if (root == null) return result;
        path.add(root.val);
        traversal(root, targetSum - root.val);
        return result;
    }

    private void traversal(TreeNode node, int count) {

        if (node.left == null && node.right == null) {
            if (count == 0) {
                result.add(new ArrayList<>(path));
            }
            return;
        }

        if (node.left != null) {
            path.add(node.left.val);
            traversal(node.left, count - node.left.val);
            path.remove(path.size() - 1);
        }

        if (node.right != null) {
            path.add(node.right.val);
            traversal(node.right, count - node.right.val);
            path.remove(path.size() - 1);
        }

    }
}
